/*
 * Copyright (C), 2002-2016, 南京苏宁软件技术有限公司
 * FileName: BigDecimalUtils.java
 * Author:   10070706
 * Date:     2016年9月12日 下午10:03:11
 * Description: //模块目的、功能描述      
 * History: //修改记录
 * <author>      <time>      <version>    <desc>
 * 修改人姓名             修改时间            版本号                  描述
 */
package com.suning.sawp.service.util;

import java.math.BigDecimal;
import java.math.RoundingMode;

import org.apache.commons.lang3.StringUtils;

/**
 * 功能简述: 大数值计算工具<br>
 *
 * @author 10070706 陈辉
 */
public class BigDecimalUtils {

    private BigDecimalUtils() {

    }

    /**
     * BigDecimal精确一个小数
     */
    public static final int ONE_DECIMAL_PLACES = 1;

    /**
     * BigDecimal精确两个小数
     */
    public static final int TWO_DECIMAL_PLACES = 2;

    /**
     * BigDecimal精确三个小数
     */
    public static final int THREE_DECIMAL_PLACES = 3;

    /**
     * BigDecimal精确四个小数
     */
    public static final int FOUR_DECIMAL_PLACES = 4;

    /**
     * 
     * 功能描述: 将BigDecimal值保留两位小数，四舍五入<br>
     *
     * @param num
     * @return
     */
    public static BigDecimal halfUpOneDecimal(BigDecimal num) {
        return num.setScale(ONE_DECIMAL_PLACES, RoundingMode.HALF_UP);
    }

    /**
     * 
     * 功能描述: 将BigDecimal值保留两位小数，四舍五入<br>
     *
     * @param num
     * @return
     */
    public static BigDecimal halfUpTwoDecimal(BigDecimal num) {
        return num.setScale(TWO_DECIMAL_PLACES, RoundingMode.HALF_UP);
    }

    /**
     * 
     * 功能描述: 四舍五入两位String<br>
     *
     * @param num
     * @return
     */
    public static String halfUpTwoDecimalOfStr(BigDecimal num) {
        return String.valueOf(num.setScale(TWO_DECIMAL_PLACES, RoundingMode.HALF_UP));
    }

    /**
     * 
     * 功能描述: 将String值保留两位小数，四舍五入<br>
     *
     * @param num
     * @return
     */
    public static String halfUpTwoDecimal(String num) {
        return String.valueOf(halfUpTwoDecimal(new BigDecimal(num)));
    }

    /**
     * 
     * 功能描述: 将BigDecimal值保留三位小数，四舍五入<br>
     *
     * @param num
     * @return
     */
    public static BigDecimal halfUpThreeDecimal(BigDecimal num) {
        return num.setScale(THREE_DECIMAL_PLACES, RoundingMode.HALF_UP);
    }

    /**
     * 
     * 功能描述: 将BigDecimal值保留四位小数，四舍五入<br>
     *
     * @param num
     * @return
     */
    public static BigDecimal halfUpFourDecimal(BigDecimal num) {
        return num.setScale(FOUR_DECIMAL_PLACES, RoundingMode.HALF_UP);
    }

    /**
     * 
     * 计算除法，保留四位有效数字
     *
     * @param a
     * @param b
     * @return
     */
    public static BigDecimal calculateDivide(BigDecimal a, BigDecimal b) {
        if (b.compareTo(new BigDecimal(0)) == 0) {
            return new BigDecimal(0);
        }
        return halfUpFourDecimal(a.divide(b, FOUR_DECIMAL_PLACES, RoundingMode.HALF_UP));
    }

    /**
     * 
     * 计算百分比的小数形式 a/b
     *
     * @param a
     * @param b
     * @return
     */
    public static String calculatePercentDecimals(BigDecimal a, BigDecimal b) {
        if (a == null || b == null || b.compareTo(new BigDecimal(0)) == 0) {
            return "--";
        }
        BigDecimal result = halfUpFourDecimal(a.divide(b, FOUR_DECIMAL_PLACES, RoundingMode.HALF_UP));
        return String.valueOf(result);
    }

    /**
     * 
     * 功能描述: 保留一位小数的百分比形式数据<br>
     *
     * @param num
     * @return
     */
    public static String getDigitPercent(String num) {
        if (StringUtils.equals("--", num)) {
            return num;
        }
        BigDecimal result = halfUpOneDecimal(new BigDecimal(num).multiply(new BigDecimal(100)));
        return String.valueOf(result) + "%";
    }

    /**
     * 
     * 功能描述: 计算两个值的百分比，除数为0返回0，被除数为0返回--<br>
     *
     * @param num1
     * @param num2
     * @return
     */
    public static String calPercent(Integer num1, Integer num2) {
        if (null == num1 || null == num2) {
            return "--";
        }

        if (num2 == 0) {
            return "--";
        }

        if (num1 == 0) {
            return "0.0%";
        }

        BigDecimal result = halfUpOneDecimal(new BigDecimal(num1).divide(new BigDecimal(num2), 3, RoundingMode.HALF_UP)
                .multiply(new BigDecimal(100)));
        return String.valueOf(result) + "%";
    }

    /**
     * 
     * 功能描述: 计算两个值的百分比，除数为0返回0，被除数为0返回--<br>
     *
     * @param num1
     * @param num2
     * @return
     */
    public static String calPercent(BigDecimal num1, BigDecimal num2) {

        if (null == num2 || num2.compareTo(new BigDecimal(0)) == 0) {
            return "--";
        }

        if (null == num1 || num1.compareTo(new BigDecimal(0)) == 0) {
            return "0.0%";
        }

        BigDecimal result = halfUpOneDecimal(num1.divide(num2, 3, RoundingMode.HALF_UP).multiply(new BigDecimal(100)));
        return String.valueOf(result) + "%";
    }

    /**
     * 
     * 功能描述: 计算两个值的比值，除数为0返回0，被除数为0返回--<br>
     *
     * @param num1
     * @param num2
     * @return
     */
    public static String calRatioForThreeDecimal(Integer num1, Integer num2) {
        if (null == num1 || null == num2) {
            return "--";
        }

        if (num2 == 0) {
            return "--";
        }

        if (num1 == 0) {
            return "0";
        }

        BigDecimal result = halfUpThreeDecimal(
                new BigDecimal(num1).divide(new BigDecimal(num2), 3, RoundingMode.HALF_UP));
        return String.valueOf(result);
    }
}
